package com.zhengke.pojo;

//导入需要的jar包
import java.awt.*;
import java.awt.image.*;
import java.util.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.ui.ModelMap;

public class MyVerifyCode {

	// 首先是生成随机的验证码
	static Random random = new Random();// 这个类用来生产随机数
	static String source = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";// 这个字符串是规定了所有的内容取值的空间
	// 将字符串装换成字符数组方便进行数组内容的获取
	static char[] verificationcode = source.toCharArray();

	// Random.nextInt()中的参数是一个区间，随机数将会在这个区间内进行生成
	// 下面将进行随机数的生成,会根据用户自定义的随机数的个数进行生成
	private static String randStrin(int length) {
		char[] buf = new char[length];   //根据用户定义的一个随机数的长度进行创建一个字符数组用来装随机生成的字符
		// 或字符区间的总长度
		int allLength = source.length();
		// 循环遍历生成规定个数的字符串
		for (int i = 0; i < length; i++) {
			// 随机生成一个数字
			int suiji = random.nextInt(allLength);
			buf[i] = verificationcode[suiji];
		}
		// 将随机产生的字符数组装换成字符串
		String suijiString = new String(buf);
		// 将其返回出去
		return suijiString;
	}

	private static String randStrinQrcode(int length) {
		char[] buf = new char[length];   //根据用户定义的一个随机数的长度进行创建一个字符数组用来装随机生成的字符
		// 或字符区间的总长度
		int allLength = source.length();
		// 循环遍历生成规定个数的字符串
		for (int i = 0; i < length; i++) {
			// 随机生成一个数字
			int suiji = random.nextInt(allLength);
			buf[i] = verificationcode[suiji];
		}
		// 将随机产生的字符数组装换成字符串
		String suijiString = new String(buf);
		// 将其返回出去
		return suijiString;
	}

	// 由于这是一个私有的方法需要提供一个公共的方法
	public static String getVerificateString(int i) {
		String verificateString = randStrin(i);
		return verificateString;
	}
	public static String getQrcoxeString(int i) {
		String verificateString = randStrinQrcode(i);
		return verificateString;
	}

	// 创建一个范围并且给周围进行颜色的随机的分配
	public static Color getRandColor(int fc, int bc) {
		Random newRandom = new Random();
		if (fc > 255) {
			fc = 255;// 根据用户输入的参数随机生成数字用来定义颜色
		}
		if (bc > 255) {
			bc = 255;
		}
		// 随机生成三个数字来定义颜色
		int r = fc + newRandom.nextInt(bc - fc);
		int g = fc + newRandom.nextInt(bc - fc);
		int b = fc + newRandom.nextInt(bc - fc);
		// 返回出去一个Color对象
		return new Color(r, g, b);
	}

	// 创建一个验证码图像的生成方法
	public static BufferedImage createImage(String scode) {
		try {
			// 设置字符的字体
			Font codeFont = new Font("Arial Black", Font.PLAIN, 20);
			// 获取验证码的长度
			int scodeLength = scode.length();
			// 设置图像的宽和高
			int width = 22 * scodeLength, height = 38;
			// 设置推向中的文字对应图像的左边边距
			int liftWidth = (int) (width - 24) / scodeLength;
			// 设置字符的上边的字符边距
			int hightwidth = 25;
			// 在内存中创建图像的对象
			BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
			// 获取图形的上下文对象
			Graphics g = image.getGraphics();
			// 创建随机类
			Random random = new Random();
			// 设定背景色
			g.setColor(getRandColor(200, 240));
			g.fillRect(0, 0, width, height);
			// 设定字体
			g.setFont(codeFont);
			// 话随机的线条
			g.setColor(getRandColor(10, 50));
			g.drawRect(0, 0, width - 1, height - 1);
			// 随机生成155条干扰线，进行防干扰
			g.setColor(getRandColor(200, 240));
			for(int i = 0;i<200;i++) {
				int x = random.nextInt(width);
				int y = random.nextInt(height);
				int xy = random.nextInt(11);
				int yl = random.nextInt(11);
				g.drawLine(x, y, x + xy, y + yl);
			}
			
			for (int i = 0; i < scodeLength; i++) {
				String rand = scode.substring(i, i + 1);
				// 将认证码显示到图象中
				g.setColor(new Color(20 + random.nextInt(60), 20 + random
						.nextInt(120), 20 + random.nextInt(180)));
				g.drawString(rand, liftWidth * i + 14, hightwidth);
			}
			// 图象生效
			g.dispose();
			return image;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/*
	 * public static void main(String[] args) { String s1 =
	 * MyVerifyCode.randStrin(4); System.out.println(s1); Image im =
	 * MyVerifyCode.createImage(s1); Graphics g = im.getGraphics(); g.drawString(s1,
	 * 20, 20); }
	 */
}
